package main

import "fmt"

/*
从左至右扫描，当前扫描的数还不确定要不要删，入栈暂存。
123531这样「高位递增」的数，肯定不会想删高位，会尽量删低位。
432135这样「高位递减」的数，会想干掉高位，直接让高位变小，效果好。
所以，如果当前遍历的数比栈顶大，符合递增，是满意的，让它入栈。
如果当前遍历的数比栈顶小，栈顶立刻出栈，不管后面有没有更大的，为什么？
	因为，栈顶的数在高位，删掉它，小的顶上，高位变小，效果好于低位变小。
 */

func removeKdigits(num string, k int) string {
	if len(num) <= k {
		return "0"
	}
	if len(num) == 0 {
		return "0"
	}
	stack := make([]rune, 0)
	// 遍历num字符串
	for _, c := range num {
		// 只要k>0且当前的c比栈顶的小，则栈顶出栈，k--
		for k > 0 && len(stack) > 0 && stack[len(stack)-1] > c {
			stack = stack[0:len(stack)-1]
			k--
		}
		// 当前的字符不是"0"，或栈非空（避免0入空栈），入栈
		//if c != '0' || len(stack) != 0 {
		//	stack = append(stack, c)
		//}
		stack = append(stack, c)
	}
	// 如果还没删够，要从stack继续删，直到k=0
	for k > 0 {
		stack = stack[0:len(stack)-1]
		k--
	}
	// 如果栈空了，返回"0"
	if len(stack) == 0 {
		return "0"
	}
	// 如果栈非空,去除前置的0，转成字符串返回
	ans := make([]rune, 0)
	flag := 1
	for _, c := range stack {
		if c == '0' && flag == 1 {
			continue
		}
		flag ++
		ans = append(ans, c)
	}
	if len(ans) == 0 {
		return "0"
	}
	return string(ans)
}


func main() {
	s := "10200"
	fmt.Println(removeKdigits(s, 1))
}
